home *** CD-ROM | disk | FTP | other *** search
/ Megahits 3 / Megahits 3 (1994)(GTI - Rhein-Main-Soft)(DE)[!].iso / module / utilities / midi / io_mt32.lha / mt33.c < prev    next >
C/C++ Source or Header  |  1993-08-12  |  30KB  |  1,098 lines

  1. #include "intuition/intuition.h"
  2. #include "libraries/dosextens.h"
  3. #include "graphics/gfxmacros.h"
  4. #include <exec/types.h>
  5. #include <exec/ports.h>
  6. #include <exec/devices.h>
  7. #include <exec/memory.h>
  8. #include <exec/interrupts.h>
  9. #include <exec/nodes.h>
  10. #include <exec/lists.h>
  11. #include <exec/libraries.h>
  12. #include <exec/tasks.h>
  13. #include <exec/execbase.h>
  14. #include <exec/io.h>
  15. #include <exec/resident.h>
  16. #include <exec/execname.h>
  17. #include <exec/exec.h>
  18. #include <exec/errors.h>
  19. #include <exec/alerts.h>
  20. #include <devices/serial.h>
  21. #include <devices/timer.h>
  22. #include <hardware/cia.h>
  23. #include <resources/cia.h>
  24. #include <stdio.h>
  25. #include <ctype.h>
  26.  
  27. #define SERIAL_PORT    (1 << 0)
  28. #define SERIAL_EXTIO    (1 << 1)
  29. #define SERIAL_DEVICE    (1 << 2)
  30. #define TIMER_PORT    (1 << 3)
  31. #define TIMER_EXTIO    (1 << 4)
  32. #define TIMER_DEVICE    (1 << 5)
  33. #define ICR_VECTOR    (1 << 6)
  34. #define ARRAY_ALLOCATED    (1 << 7)
  35.  
  36. #define END_SYSTEM_EXCLUSIVE    0xF7
  37. #define MIDI_STATUS_MASK    0x80
  38.  
  39. /* Routine declarations */
  40.  
  41. extern struct MsgPort *CreatePort();
  42. extern struct IORequest *CreateExtIO();
  43.  
  44. LONG ReadToneData();
  45. void WriteToneData();
  46.  
  47. void TimerHandler();
  48.  
  49. /* Complex interface adapter definitions */
  50.  
  51. extern struct CIA ciaa,ciab;
  52. ULONG CIAApointer;
  53.  
  54. /* Timer device structures */
  55.  
  56. struct timerequest *timerequest;
  57. struct MsgPort *timerport;
  58. struct Device *TimerBase;
  59.  
  60. /* Serial device structures */
  61.  
  62. struct IOExtSer *IORser;
  63. struct MsgPort *serialport;
  64.  
  65. /* Interrupt handler structure */
  66.  
  67. struct Interrupt interrupt;
  68.  
  69. static char *tonearray[62] = {
  70.         "Partial Structure 1 & 2",
  71.         "Partial Structure 3 & 4",
  72.         "Partial Mute           ",
  73.         "Env Mode               ",
  74.         "WGPitchCoarse          ",
  75.         "WG Pitch Fine          ",
  76.         "WG Pitch KeyFollow     ",
  77.         "WG Pitch Bender SW     ",
  78.         "WG Waveform            ",
  79.         "WG PCM Wave            ",
  80.         "WG Pulse Width         ",
  81.         "WG PW Velo Sens        ",
  82.         "P-Env Depth            ",
  83.         "P-Env Velo Sens        ",
  84.         "P-Env Time Keyf        ",
  85.         "P-Env Time 1           ",
  86.         "P-Env Time 2           ",
  87.         "P-Env Time 3           ",
  88.         "P-Env Time 4           ",
  89.         "P-Env Level 0          ",
  90.         "P-Env Level 1          ",
  91.         "P-Env Level 2          ",
  92.         "P-Env Sustain Level    ",
  93.         "End Level              ",
  94.         "P-LFO Rate             ",
  95.         "P-LFO Depth            ",
  96.         "P-LFO Mod Sens         ",
  97.         "TVF Cutoff Freq        ",
  98.         "TVF Resonance          ",
  99.         "TVF Keyfollow          ",
  100.         "TVF Bias Point         ",    
  101.         "TVF Bias Level         ",
  102.         "TVF Env Depth          ",
  103.         "TVF Env Velo Sens      ",
  104.         "TVF Env Depth Keyf     ",
  105.         "TVF Env Time Keyf      ",
  106.         "TVF Env Time 1         ",
  107.         "TVF Env Time 2         ",
  108.         "TVF Env Time 3         ",
  109.         "TVF Env Time 4         ",
  110.         "TVF Env Time 5            ",
  111.         "TVF Env Level 1        ",
  112.         "TVF Env Level 2        ",
  113.         "TVF Env Level 3        ",
  114.         "TVF Env Sustain Level  ",
  115.         "TVA Level            ",
  116.         "TVA Velo Sens          ",
  117.         "TVA Bias Point 1       ",
  118.         "TVA Bias Level 1       ",
  119.         "TVA Bias Point 2       ",
  120.         "TVA Bias Level 2       ",
  121.         "TVA Env Time Keyf      ",
  122.         "TVA Env Time V_Follow  ",
  123.         "TVA Env Time 1         ",
  124.         "TVA Env Time 2         ",
  125.         "TVA Env Time 3         ",
  126.         "TVA Env Time 4         ",
  127.         "TVA Env Time 5         ",
  128.         "TVA Env Level 1        ",    
  129.         "TVA Env Level 2        ",
  130.         "TVA Env Level 3        ",
  131.         "TVA Env Sustain Level  "
  132.         };    
  133. static UBYTE numarray[62] = {
  134.         12,
  135.         12,
  136.         15,
  137.         1,
  138.         96,
  139.         100,
  140.         16,
  141.         1,
  142.         1,
  143.         127,
  144.         100,
  145.         14,
  146.         10,
  147.         100,
  148.         4,
  149.         100,
  150.         100,
  151.         100,
  152.         100,
  153.         100,
  154.         100,
  155.         100,
  156.         100,
  157.         100,
  158.         100,
  159.         100,
  160.         100,
  161.         100,
  162.         30,
  163.         14,
  164.         127,
  165.         14,
  166.         100,
  167.         100,
  168.         4,
  169.         4,
  170.         100,
  171.         100,
  172.         100,
  173.         100,
  174.         100,
  175.         100,
  176.         100,
  177.         100,
  178.         100,
  179.         100,
  180.         100,
  181.         127,
  182.         12,
  183.         127,
  184.         12,
  185.         4,
  186.         4,
  187.         100,
  188.         100,
  189.         100,
  190.         100,
  191.         100,
  192.         100,
  193.         100,
  194.         100,
  195.         100
  196.         };
  197.  
  198. SHORT BorderVectors1[] = {
  199.     0,0,
  200.     36,0,
  201.     36,10,
  202.     0,10,
  203.     0,0
  204. };
  205. struct Border Border1 = {
  206.     -2,-1,    /* XY origin relative to container TopLeft */
  207.     3,0,JAM1,    /* front pen, back pen and drawmode */
  208.     5,    /* number of XY vectors */
  209.     BorderVectors1,    /* pointer to XY vectors */
  210.     NULL    /* next border in list */
  211. };
  212.  
  213. struct IntuiText IText1 = {
  214.     3,0,JAM2,    /* front and back text pens, drawmode and fill byte */
  215.     1,1,    /* XY origin relative to container TopLeft */
  216.     NULL,    /* font pointer or NULL for default */
  217.     "NAME",    /* pointer to text */
  218.     NULL    /* next IntuiText structure */
  219. };
  220.  
  221. struct Gadget Gadget10 = {
  222.     NULL,    /* next gadget */
  223.     20,58,    /* origin XY of hit box relative to window TopLeft */
  224.     33,9,    /* hit box width and height */
  225.     NULL,    /* gadget flags */
  226.     RELVERIFY,    /* activation flags */
  227.     BOOLGADGET,    /* gadget type flags */
  228.     (APTR)&Border1,    /* gadget border or image to be rendered */
  229.     NULL,    /* alternate imagery for selection */
  230.     &IText1,    /* first IntuiText structure */
  231.     NULL,    /* gadget mutual-exclude long word */
  232.     NULL,    /* SpecialInfo structure */
  233.     0,    /* user-definable data */
  234.     NULL    /* pointer to user-definable data */
  235. };
  236.  
  237. SHORT BorderVectors2[] = {
  238.     0,0,
  239.     36,0,
  240.     36,10,
  241.     0,10,
  242.     0,0
  243. };
  244. struct Border Border2 = {
  245.     -2,-1,    /* XY origin relative to container TopLeft */
  246.     3,0,JAM1,    /* front pen, back pen and drawmode */
  247.     5,    /* number of XY vectors */
  248.     BorderVectors2,    /* pointer to XY vectors */
  249.     NULL    /* next border in list */
  250. };
  251.  
  252. struct IntuiText IText2 = {
  253.     3,0,JAM2,    /* front and back text pens, drawmode and fill byte */
  254.     0,1,    /* XY origin relative to container TopLeft */
  255.     NULL,    /* font pointer or NULL for default */
  256.     "SAVE",    /* pointer to text */
  257.     NULL    /* next IntuiText structure */
  258. };
  259.  
  260. struct Gadget Gadget9 = {
  261.     &Gadget10,    /* next gadget */
  262.     20,43,    /* origin XY of hit box relative to window TopLeft */
  263.     33,9,    /* hit box width and height */
  264.     NULL,    /* gadget flags */
  265.     RELVERIFY,    /* activation flags */
  266.     BOOLGADGET,    /* gadget type flags */
  267.     (APTR)&Border2,    /* gadget border or image to be rendered */
  268.     NULL,    /* alternate imagery for selection */
  269.     &IText2,    /* first IntuiText structure */
  270.     NULL,    /* gadget mutual-exclude long word */
  271.     NULL,    /* SpecialInfo structure */
  272.     1,    /* user-definable data */
  273.     NULL    /* pointer to user-definable data */
  274. };
  275.  
  276. SHORT BorderVectors3[] = {
  277.     0,0,
  278.     35,0,
  279.     35,10,
  280.     0,10,
  281.     0,0
  282. };
  283. struct Border Border3 = {
  284.     -2,-1,    /* XY origin relative to container TopLeft */
  285.     3,0,JAM1,    /* front pen, back pen and drawmode */
  286.     5,    /* number of XY vectors */
  287.     BorderVectors3,    /* pointer to XY vectors */
  288.     NULL    /* next border in list */
  289. };
  290.  
  291. struct IntuiText IText3 = {
  292.     3,0,JAM2,    /* front and back text pens, drawmode and fill byte */
  293.     0,1,    /* XY origin relative to container TopLeft */
  294.     NULL,    /* font pointer or NULL for default */
  295.     "LOAD",    /* pointer to text */
  296.     NULL    /* next IntuiText structure */
  297. };
  298.  
  299. struct Gadget Gadget8 = {
  300.     &Gadget9,    /* next gadget */
  301.     21,28,    /* origin XY of hit box relative to window TopLeft */
  302.     32,9,    /* hit box width and height */
  303.     NULL,    /* gadget flags */
  304.     RELVERIFY,    /* activation flags */
  305.     BOOLGADGET,    /* gadget type flags */
  306.     (APTR)&Border3,    /* gadget border or image to be rendered */
  307.     NULL,    /* alternate imagery for selection */
  308.     &IText3,    /* first IntuiText structure */
  309.     NULL,    /* gadget mutual-exclude long word */
  310.     NULL,    /* SpecialInfo structure */
  311.     2,    /* user-definable data */
  312.     NULL    /* pointer to user-definable data */
  313. };
  314.  
  315. struct PropInfo Gadget7SInfo = {
  316.     AUTOKNOB+FREEVERT,    /* PROPINFO flags */
  317.     0,0xffff,    /* horizontal and vertical pot values */
  318.     0xffff,0xffff/16,    /* horizontal and vertical body values */
  319. };
  320.  
  321. struct Image Image1 = {
  322.     0,69,    /* XY origin relative to container TopLeft */
  323.     14,4,    /* Image width and height in pixels */
  324.     0,    /* number of bitplanes in Image */
  325.     NULL,    /* pointer to ImageData */
  326.     0x0000,0x0000,    /* PlanePick and PlaneOnOff */
  327.     NULL    /* next Image structure */
  328. };
  329.  
  330. struct Gadget Gadget7 = {
  331.     &Gadget8,    /* next gadget */
  332.     25,80,    /* origin XY of hit box relative to window TopLeft */
  333.     22,81,    /* hit box width and height */
  334.     NULL,    /* gadget flags */
  335.     RELVERIFY,    /* activation flags */
  336.     PROPGADGET,    /* gadget type flags */
  337.     (APTR)&Image1,    /* gadget border or image to be rendered */
  338.     NULL,    /* alternate imagery for selection */
  339.     NULL,    /* first IntuiText structure */
  340.     NULL,    /* gadget mutual-exclude long word */
  341.     (APTR)&Gadget7SInfo,    /* SpecialInfo structure */
  342.     3,    /* user-definable data */
  343.     NULL    /* pointer to user-definable data */
  344. };
  345.  
  346. struct PropInfo Gadget6SInfo = {
  347.     AUTOKNOB+FREEVERT,    /* PROPINFO flags */
  348.     0,0xffff,    /* horizontal and vertical pot values */
  349.     0xffff,0xffff/16,    /* horizontal and vertical body values */
  350. };
  351.  
  352. struct Image Image2 = {
  353.     0,111,    /* XY origin relative to container TopLeft */
  354.     14,6,    /* Image width and height in pixels */
  355.     0,    /* number of bitplanes in Image */
  356.     NULL,    /* pointer to ImageData */
  357.     0x0000,0x0000,    /* PlanePick and PlaneOnOff */
  358.     NULL    /* next Image structure */
  359. };
  360.  
  361. struct Gadget Gadget6 = {
  362.     &Gadget7,    /* next gadget */
  363.     70,40,    /* origin XY of hit box relative to window TopLeft */
  364.     22,121,    /* hit box width and height */
  365.     NULL,    /* gadget flags */
  366.     RELVERIFY,    /* activation flags */
  367.     PROPGADGET,    /* gadget type flags */
  368.     (APTR)&Image2,    /* gadget border or image to be rendered */
  369.     NULL,    /* alternate imagery for selection */
  370.     NULL,    /* first IntuiText structure */
  371.     NULL,    /* gadget mutual-exclude long word */
  372.     (APTR)&Gadget6SInfo,    /* SpecialInfo structure */
  373.     4,    /* user-definable data */
  374.     NULL    /* pointer to user-definable data */
  375. };
  376.  
  377. struct PropInfo Gadget5SInfo = {
  378.     AUTOKNOB+FREEVERT,    /* PROPINFO flags */
  379.     0,0xffff,    /* horizontal and vertical pot values */
  380.     0xffff,0xffff/16,    /* horizontal and vertical body values */
  381. };
  382.  
  383. struct Image Image3 = {
  384.     0,111,    /* XY origin relative to container TopLeft */
  385.     14,6,    /* Image width and height in pixels */
  386.     0,    /* number of bitplanes in Image */
  387.     NULL,    /* pointer to ImageData */
  388.     0x0000,0x0000,    /* PlanePick and PlaneOnOff */
  389.     NULL    /* next Image structure */
  390. };
  391.  
  392. struct Gadget Gadget5 = {
  393.     &Gadget6,    /* next gadget */
  394.     115,40,    /* origin XY of hit box relative to window TopLeft */
  395.     22,121,    /* hit box width and height */
  396.     NULL,    /* gadget flags */
  397.     RELVERIFY,    /* activation flags */
  398.     PROPGADGET,    /* gadget type flags */
  399.     (APTR)&Image3,    /* gadget border or image to be rendered */
  400.     NULL,    /* alternate imagery for selection */
  401.     NULL,    /* first IntuiText structure */
  402.     NULL,    /* gadget mutual-exclude long word */
  403.     (APTR)&Gadget5SInfo,    /* SpecialInfo structure */
  404.     5,    /* user-definable data */
  405.     NULL    /* pointer to user-definable data */
  406. };
  407.  
  408. struct PropInfo Gadget4SInfo = {
  409.     AUTOKNOB+FREEVERT,    /* PROPINFO flags */
  410.     0,0xffff,    /* horizontal and vertical pot values */
  411.     0xffff,0xffff/16,    /* horizontal and vertical body values */
  412. };
  413.  
  414. struct Image Image4 = {
  415.     0,111,    /* XY origin relative to container TopLeft */
  416.     14,6,    /* Image width and height in pixels */
  417.     0,    /* number of bitplanes in Image */
  418.     NULL,    /* pointer to ImageData */
  419.     0x0000,0x0000,    /* PlanePick and PlaneOnOff */
  420.     NULL    /* next Image structure */
  421. };
  422.  
  423. struct Gadget Gadget4 = {
  424.     &Gadget5,    /* next gadget */
  425.     160,40,    /* origin XY of hit box relative to window TopLeft */
  426.     22,121,    /* hit box width and height */
  427.     NULL,    /* gadget flags */
  428.     RELVERIFY,    /* activation flags */
  429.     PROPGADGET,    /* gadget type flags */
  430.     (APTR)&Image4,    /* gadget border or image to be rendered */
  431.     NULL,    /* alternate imagery for selection */
  432.     NULL,    /* first IntuiText structure */
  433.     NULL,    /* gadget mutual-exclude long word */
  434.     (APTR)&Gadget4SInfo,    /* SpecialInfo structure */
  435.     6,    /* user-definable data */
  436.     NULL    /* pointer to user-definable data */
  437. };
  438.  
  439. struct PropInfo Gadget3SInfo = {
  440.     AUTOKNOB+FREEVERT,    /* PROPINFO flags */
  441.     0,0xffff,    /* horizontal and vertical pot values */
  442.     0xffff,0xffff/16,    /* horizontal and vertical body values */
  443. };
  444.  
  445. struct Image Image5 = {
  446.     0,111,    /* XY origin relative to container TopLeft */
  447.     14,6,    /* Image width and height in pixels */
  448.     0,    /* number of bitplanes in Image */
  449.     NULL,    /* pointer to ImageData */
  450.     0x0000,0x0000,    /* PlanePick and PlaneOnOff */
  451.     NULL    /* next Image structure */
  452. };
  453.  
  454. struct Gadget Gadget3 = {
  455.     &Gadget4,    /* next gadget */
  456.     205,40,    /* origin XY of hit box relative to window TopLeft */
  457.     22,121,    /* hit box width and height */
  458.     NULL,    /* gadget flags */
  459.     RELVERIFY,    /* activation flags */
  460.     PROPGADGET,    /* gadget type flags */
  461.     (APTR)&Image5,    /* gadget border or image to be rendered */
  462.     NULL,    /* alternate imagery for selection */
  463.     NULL,    /* first IntuiText structure */
  464.     NULL,    /* gadget mutual-exclude long word */
  465.     (APTR)&Gadget3SInfo,    /* SpecialInfo structure */
  466.     7,    /* user-definable data */
  467.     NULL    /* pointer to user-definable data */
  468. };
  469.  
  470. struct PropInfo Gadget2SInfo = {
  471.     AUTOKNOB+FREEVERT,    /* PROPINFO flags */
  472.     0,0xffff,    /* horizontal and vertical pot values */
  473.     0xffff,0xffff/16,    /* horizontal and vertical body values */
  474. };
  475.  
  476. struct Image Image6 = {
  477.     0,111,    /* XY origin relative to container TopLeft */
  478.     14,6,    /* Image width and height in pixels */
  479.     0,    /* number of bitplanes in Image */
  480.     NULL,    /* pointer to ImageData */
  481.     0x0000,0x0000,    /* PlanePick and PlaneOnOff */
  482.     NULL    /* next Image structure */
  483. };
  484.  
  485. struct Gadget Gadget2 = {
  486.     &Gadget3,    /* next gadget */
  487.     250,40,    /* origin XY of hit box relative to window TopLeft */
  488.     22,121,    /* hit box width and height */
  489.     NULL,    /* gadget flags */
  490.     RELVERIFY,    /* activation flags */
  491.     PROPGADGET,    /* gadget type flags */
  492.     (APTR)&Image6,    /* gadget border or image to be rendered */
  493.     NULL,    /* alternate imagery for selection */
  494.     NULL,    /* first IntuiText structure */
  495.     NULL,    /* gadget mutual-exclude long word */
  496.     (APTR)&Gadget2SInfo,    /* SpecialInfo structure */
  497.     8,    /* user-definable data */
  498.     NULL    /* pointer to user-definable data */
  499. };
  500.  
  501. UBYTE Gadget1SIBuff[80];
  502. struct StringInfo Gadget1SInfo = {
  503.     Gadget1SIBuff,    /* buffer where text will be edited */
  504.     NULL,    /* optional undo buffer */
  505.     0,    /* character position in buffer */
  506.     80,    /* maximum number of characters to allow */
  507.     0,    /* first displayed character buffer position */
  508.     0,0,0,0,0,    /* Intuition initialized and maintained variables */
  509.     0,    /* Rastport of gadget */
  510.     0,    /* initial value for integer gadgets */
  511.     NULL    /* alternate keymap (fill in if you set the flag) */
  512. };
  513.  
  514. USHORT StrVectors[] = { 
  515.     0,0,
  516.     252,0,
  517.     252,9,
  518.     0,9,
  519.     0,0
  520. };    
  521. struct Border StrBorder = {
  522.     -2,-1,
  523.     1,0,JAM1,
  524.     5,
  525.     StrVectors,
  526.     NULL
  527. };
  528. struct Gadget Gadget1 = {
  529.     &Gadget2,    /* next gadget */
  530.     23,15,    /* origin XY of hit box relative to window TopLeft */
  531.     252,9,    /* hit box width and height */
  532.     GADGHCOMP,    /* gadget flags */
  533.     RELVERIFY+STRINGCENTER,    /* activation flags */
  534.     STRGADGET,    /* gadget type flags */
  535.     (APTR)&StrBorder,    /* gadget border or image to be rendered */
  536.     NULL,    /* alternate imagery for selection */
  537.     NULL,    /* first IntuiText structure */
  538.     NULL,    /* gadget mutual-exclude long word */
  539.     (APTR)&Gadget1SInfo,    /* SpecialInfo structure */
  540.     9,    /* user-definable data */
  541.     NULL    /* pointer to user-definable data */
  542. };
  543.  
  544. #define GadgetList1 Gadget1
  545.  
  546. struct NewWindow NewWindowStructure1 = {
  547.     0,0,    /* window XY origin relative to TopLeft of screen */
  548.     300,200,    /* window width and height */
  549.     0,1,    /* detail and block pens */
  550.     GADGETUP | CLOSEWINDOW,    /* IDCMP flags */
  551.     WINDOWSIZING+WINDOWDRAG+WINDOWDEPTH+NOCAREREFRESH+WINDOWCLOSE,    /* other window flags */
  552.     &Gadget1,    /* first gadget in gadget list */
  553.     NULL,    /* custom CHECKMARK imagery */
  554.     "MT-32 Editor",    /* window title */
  555.     NULL,    /* custom screen pointer */
  556.     NULL,    /* custom bitmap */
  557.     5,5,    /* minimum width and height */
  558.     300,200,    /* maximum width and height */
  559.     WBENCHSCREEN    /* destination screen type */
  560. };
  561.  
  562. extern struct MsgPort *CreatePort();
  563. struct Window  *OpenWindow();
  564. struct IntuiMessage  *GetMsg();
  565. struct RastPort *rp;
  566. struct Window *window;
  567. struct Screen *screen;
  568. struct GfxBase *GfxBase;
  569. struct IntuitionBase *IntuitionBase;
  570. struct IntuiMessage *message;
  571. UBYTE tonedata[246];
  572. int channel,patchg,patchn,parameter,address,timbre,error;
  573. int i,cort,channum,notenum;
  574. int resources = 0;        /* resource allocation flags */
  575. char filename[80];
  576. ULONG micros,secs;        /* MIDI event time */
  577.  
  578. main ()
  579. {
  580.     APTR address = message->IAddress;    
  581.     if  ((IntuitionBase = 
  582.     (struct IntuitionBase  *)OpenLibrary("intuition.library", 1)) == NULL)
  583.       Cleanup("error: couldn't open intuition library\n");
  584.     if  ((GfxBase = 
  585.     (struct GfxBase  *)OpenLibrary("graphics.library", 1)) == NULL)
  586.         Cleanup("Error: couldn't open graphics library\n");
  587.     if  ((window = OpenWindow(&NewWindowStructure1)) == NULL)
  588.       Cleanup("Error: couldn't open window\n");    
  589. serialport = CreatePort(SERIALNAME,0);
  590. if (serialport == NULL) Cleanup("Unable to CreatePort serial");
  591. resources |= SERIAL_PORT;
  592. IORser = (struct IOExtSer *)
  593.     CreateExtIO(serialport, sizeof(struct IOExtSer));
  594. if (IORser == NULL) Cleanup("Unable to CreateExtIO serial");
  595. resources |= SERIAL_EXTIO;
  596. if ((error = OpenDevice(SERIALNAME,0,IORser,0))!= 0)
  597.     Cleanup("Unable to open serial device");
  598. resources |= SERIAL_DEVICE;
  599. if ((error = SetParams(IORser)) != 0)
  600.     Cleanup("Unable to set serial parameters");
  601. timerport = CreatePort (0,0);
  602. if (timerport == 0) Cleanup ("Unable to CreatePort timer");
  603. resources |= TIMER_PORT;
  604. timerequest = (struct timerequest *)
  605.     CreateExtIO (timerport, sizeof(struct timerequest));
  606. if (timerequest == 0) Cleanup ("Unable to CreateExtIO timer");
  607. resources |= TIMER_EXTIO;
  608. if ((error = OpenDevice(TIMERNAME,UNIT_MICROHZ,timerequest,0))  != 0)
  609.     Cleanup("Unable to open timer device");
  610. TimerBase = timerequest->tr_node.io_Device;
  611. resources |= TIMER_DEVICE;
  612. CIAApointer = OpenResource(CIAANAME);
  613. interrupt.is_Node.ln_Type = NT_INTERRUPT;
  614. interrupt.is_Node.ln_Pri = 0;
  615. interrupt.is_Node.ln_Name = "timer.handler";
  616. interrupt.is_Data = NULL;
  617. interrupt.is_Code = TimerHandler;
  618. if (error = AddICRVector (CIAApointer, CIAICRB_TA, &interrupt) != 0)
  619.     Cleanup ("Unable to add interrupt vector");
  620. resources |= ICR_VECTOR;
  621.     rp=window->RPort;
  622.     SetAPen(window->RPort,1);
  623.     Move(window->RPort,257,35);
  624.     Text(window->RPort,"4",1);
  625.     Move(window->RPort,212,35);
  626.     Text(window->RPort,"3",1);
  627.     Move(window->RPort,166,35);
  628.     Text(window->RPort,"2",1);
  629.     Move(window->RPort,121,35);
  630.     Text(window->RPort,"1",1);
  631.     Move(window->RPort,14,180);
  632.     Text(window->RPort,"TIMBRE",6);
  633.     Move(window->RPort,33,170);
  634.     Text(window->RPort,"1",1);
  635.     Move(window->RPort,110,180);
  636.     Text(window->RPort,"Partial Parameter      ",23);
  637.     
  638.     while(1)        {
  639.         message = (struct IntuiMessage *)GetMsg(window->UserPort);
  640.         if (message == NULL)
  641.             WaitPort(window->UserPort);
  642.         else 
  643.             if(handle_messages(message) == FALSE)
  644.                 break;
  645.                 }
  646.     }
  647.  
  648.     
  649. handle_messages(ms)
  650.     struct IntuiMessage *ms;
  651.     {
  652.     struct IntuiMessage localms;
  653.     int i;
  654.     UBYTE *s,*d;
  655.     int result;
  656.     s=(UBYTE *)ms;
  657.     d=(UBYTE *)&localms;
  658.     for (i=0;i<sizeof(struct IntuiMessage);i++)
  659.     {
  660.         *d++=*s++;
  661.     }
  662.  
  663.           ReplyMsg(ms);
  664.           
  665.           switch(localms.Class)
  666.           {
  667.           case CLOSEWINDOW:      
  668.               Cleanup(NULL);
  669.                 break;
  670.           
  671.           case GADGETUP:
  672.               handle_gadget(&localms);
  673.               break;
  674.           default:
  675.               result = 1;
  676.               break;
  677.         };
  678.     return(result);
  679.        }
  680.        
  681. #define GADGETID ((struct Gadget *)IAddress)->GadgetID       
  682. handle_gadget(message)      
  683. struct IntuiMessage *message;
  684. {
  685.     SHORT id;
  686.     UBYTE data,*ptr;
  687.     int x;
  688.     char *filename,IntText[20];
  689.     struct Gadget *g;
  690.     g = (struct Gadget *)(message->IAddress);
  691.     id = g->GadgetID;
  692.     
  693.     switch (id) {
  694.         case 0:address=1+(7*Gadget7SInfo.VertPot)/0xffff;
  695.              for(i=0;i<10;i++)
  696.                 ModifyPatchData(address,8,i,toascii(Gadget1SIBuff[i]));
  697.                 SendPatchData(address,2,address-1);
  698.               break;
  699.         case 1: address=1+(7*Gadget7SInfo.VertPot)/0xffff;
  700.                 ReceiveToneData (8,&tonedata,address-1);
  701.             WriteToneData (&tonedata,Gadget1SIBuff);
  702.             break;
  703.         case 2: ReadToneData (&tonedata,Gadget1SIBuff);
  704.             address=1+(7*Gadget7SInfo.VertPot)/0xffff;  
  705.             SendToneData (&tonedata,address-1);
  706.             SendPatchData (address,2,address-1);
  707.             ReceiveToneData (8,&tonedata,address-1);
  708.                 Move(window->RPort,7,180);
  709.                 for(x=0;x<10;x++) {
  710.                 sprintf(IntText+x,"%c",tonedata[x]);
  711.                 }
  712.             Text(window->RPort,IntText,10);
  713.             break;
  714.         case 3: address=1+(7*Gadget7SInfo.VertPot)/0xffff;
  715.                 Move(window->RPort,33,170);
  716.                 sprintf(IntText, "%d ",address);
  717.              Text(window->RPort,IntText,strlen(IntText));
  718.              ReceiveToneData (8,&tonedata,address-1);
  719.                 Move(window->RPort,7,180);
  720.                 for(x=0;x<10;x++) {
  721.                 sprintf(IntText+x,"%c",tonedata[x]);
  722.                 }
  723.             Text(window->RPort,IntText,10);
  724.             parameter=1+(61*Gadget6SInfo.VertPot)/0xffff;
  725.                 if(parameter<5) {
  726.                    data=tonedata[parameter+9];
  727.                    Move(window->RPort,108,170);
  728.                 sprintf(IntText, "%3d",data);
  729.                 Text(window->RPort,IntText,strlen(IntText));
  730.              }
  731.             else {
  732.              for(x=0;x<4;x++) {
  733.                data=tonedata[x*58+parameter+9];
  734.                Move(window->RPort,108+x*45,170);
  735.                 sprintf(IntText, "%3d",data);
  736.                 Text(window->RPort,IntText,strlen(IntText));
  737.              } 
  738.             }
  739.                 break;
  740.         case 4: address=1+(7*Gadget7SInfo.VertPot)/0xffff; 
  741.                 ReceiveToneData (8,&tonedata,address-1);
  742.                 parameter=1+(61*Gadget6SInfo.VertPot)/0xffff;
  743.             Move(window->RPort,102,180);
  744.             Text(window->RPort,tonearray[parameter-1],23);
  745.                 if(parameter<5) {
  746.                    data=tonedata[parameter+9];
  747.                    Move(window->RPort,108,170);
  748.                 sprintf(IntText, "%3d",data);
  749.                 Text(window->RPort,IntText,strlen(IntText));
  750.                 SetAPen(window->RPort,0);
  751.              for(x=1;x<4;x++) {
  752.                Move(window->RPort,108+x*45,170);
  753.                 Text(window->RPort,"   ",3);
  754.                 }
  755.                 SetAPen(window->RPort,1);
  756.              }
  757.             else {
  758.              for(x=0;x<4;x++) {
  759.                data=tonedata[x*58+parameter+9];
  760.                Move(window->RPort,108+x*45,170);
  761.                 sprintf(IntText, "%3d",data);
  762.                 Text(window->RPort,IntText,strlen(IntText));
  763.              } 
  764.             }
  765.             break;  
  766.         case 5: parameter=1+(61*Gadget6SInfo.VertPot)/0xffff;
  767.                 address=1+(7*Gadget7SInfo.VertPot)/0xffff;
  768.                 if(parameter<5) {
  769.                    patchn=(numarray[parameter-1]*Gadget5SInfo.VertPot)/0xffff;
  770.                    Move(window->RPort,108,170);
  771.                 sprintf(IntText, "%3d",patchn);
  772.                 Text(window->RPort,IntText,strlen(IntText));
  773.                   ModifyPatchData(address,8,parameter+9,patchn);
  774.                SendPatchData (address,2,address-1);
  775.             }  
  776.             else { 
  777.                ReceiveToneData (8,&tonedata,address-1);
  778.                ptr=&tonedata;
  779.                patchn=(numarray[parameter-1]*Gadget5SInfo.VertPot)/0xffff;
  780.                Move(window->RPort,108,170);
  781.                 sprintf(IntText, "%3d",patchn);
  782.                Text(window->RPort,IntText,strlen(IntText));
  783.                *(ptr+parameter+9)=patchn;
  784.                SendToneData (&tonedata,address-1);
  785.                SendPatchData (address,2,address-1);
  786.               }
  787.             break;  
  788.         case 6: parameter=1+(61*Gadget6SInfo.VertPot)/0xffff;
  789.                 address=1+(7*Gadget7SInfo.VertPot)/0xffff;
  790.                ReceiveToneData (8,&tonedata,address-1);
  791.                ptr=&tonedata;
  792.                patchn=(numarray[parameter-1]*Gadget4SInfo.VertPot)/0xffff;
  793.                Move(window->RPort,153,170);
  794.                 sprintf(IntText, "%3d",patchn);
  795.                 Text(window->RPort,IntText,strlen(IntText));
  796.                *(ptr+58+parameter+9)=patchn;
  797.                SendToneData (&tonedata,address-1);
  798.                SendPatchData (address,2,address-1);
  799.             break; 
  800.         case 7: parameter=1+(61*Gadget6SInfo.VertPot)/0xffff;
  801.                 address=1+(7*Gadget7SInfo.VertPot)/0xffff;
  802.                ReceiveToneData (8,&tonedata,address-1);
  803.                ptr=&tonedata;
  804.                patchn=(numarray[parameter-1]*Gadget3SInfo.VertPot)/0xffff;
  805.                Move(window->RPort,198,170);
  806.                 sprintf(IntText, "%3d",patchn);
  807.                 Text(window->RPort,IntText,strlen(IntText));
  808.                *(ptr+116+parameter+9)=patchn;
  809.                SendToneData (&tonedata,address-1);
  810.                SendPatchData (address,2,address-1);
  811.             break; 
  812.         case 8: parameter=1+(61*Gadget6SInfo.VertPot)/0xffff;
  813.                 address=1+(7*Gadget7SInfo.VertPot)/0xffff;
  814.                ReceiveToneData (8,&tonedata,address-1);
  815.                ptr=&tonedata;
  816.                patchn=(numarray[parameter-1]*Gadget2SInfo.VertPot)/0xffff;
  817.                Move(window->RPort,243,170);
  818.                 sprintf(IntText, "%3d",patchn);
  819.                 Text(window->RPort,IntText,strlen(IntText));
  820.                *(ptr+174+parameter+9)=patchn;
  821.                SendToneData (&tonedata,address-1);
  822.                SendPatchData (address,2,address-1);
  823.             break;
  824.         case 9: break;
  825.     }    
  826.  }
  827.  
  828. Cleanup(ExitText)
  829. char *ExitText;
  830. {    
  831. if (resources & ICR_VECTOR)
  832.     RemICRVector (CIAApointer, CIAICRB_TA, &interrupt);
  833. if (resources & TIMER_DEVICE) CloseDevice (timerequest);
  834. if (resources & TIMER_EXTIO)
  835.     DeleteExtIO(timerequest, sizeof(struct timerequest));
  836. if (resources & TIMER_PORT) DeletePort (timerport);
  837. if (resources & SERIAL_DEVICE) {
  838.     /* Reset the serial device and then close it */
  839.     IORser->IOSer.io_Command = CMD_RESET;
  840.     DoIO (IORser);
  841.     CloseDevice (IORser); }
  842. if (resources & SERIAL_EXTIO)
  843.     DeleteExtIO(IORser, sizeof(struct IOExtSer));
  844. if (resources & SERIAL_PORT) DeletePort (serialport);
  845.      if  (window)  CloseWindow(window);
  846.     if  (GfxBase) CloseLibrary(GfxBase);
  847.     if  (IntuitionBase)  CloseLibrary(IntuitionBase);
  848.     if  (ExitText)  fprintf(stderr, ExitText);
  849.     exit  (!!ExitText);
  850. }    
  851.  
  852. /* Receive tone data from the MT-32 */
  853.  
  854. ReceiveToneData (address,tonedata,timbre)
  855. UBYTE timbre;
  856. {
  857. UBYTE checksum=0;
  858. int addSB,addLSB;
  859.  
  860. /* Send Request 1 system exclusive data */
  861. UBYTE sendrequest[13];
  862. static UBYTE sendarray[5] = {0xF0,0x41,0x10,0x16,0x11};
  863. UBYTE data[512];
  864. UBYTE *ptr;
  865.  
  866. int i;
  867. for (i=0;i<5;i++) sendrequest[i]=sendarray[i];
  868. i = timbre * 0x200;
  869. addSB=(i>>8);addLSB=((i<<4)>>4);
  870. sendrequest[5]=8;
  871. sendrequest[6]=addSB;sendrequest[7]=addLSB;
  872. sendrequest[8]=0;
  873. if (address==4) {sendrequest[9]=1;  sendrequest[10]=0x76;}
  874. else if (address==8) {sendrequest[9]=2;  sendrequest[10]=0x00;}
  875. for (i=5;i<11;i++)  {
  876.     checksum += sendrequest[i];
  877.             }  
  878.    checksum=checksum%256;
  879.    if (checksum<=128)checksum=128-checksum;    
  880.    else if (checksum<256) checksum=256-checksum;
  881. sendrequest[11]=checksum;
  882. sendrequest[12]=0xF7;
  883.     
  884. /* Clear the serial buffer of any unread data */
  885.  
  886. IORser->IOSer.io_Command = CMD_CLEAR;
  887. DoIO (IORser);
  888.  
  889. /* Send request to MT-32 */
  890.  
  891. IORser->IOSer.io_Data = (APTR) &sendrequest;
  892. IORser->IOSer.io_Length = sizeof(sendrequest);
  893. IORser->IOSer.io_Command = CMD_WRITE;
  894.  
  895. DoIO(IORser);
  896.  
  897. /* Read tone data and "end-system-exclusive" from MT-32 */
  898.  
  899. IORser->IOSer.io_Data = (APTR) &data;
  900. if (address==4) IORser->IOSer.io_Length = 254;
  901. if (address==8) IORser->IOSer.io_Length = 265;
  902. IORser->IOSer.io_Command = CMD_READ;
  903.  
  904. DoIO (IORser);
  905.     
  906. /* Build a Tone Data  from the 8 bit values returned from the MT-32 */
  907.  
  908. ptr = (UBYTE *) tonedata;
  909. for (i=8; i<254; i++)  {
  910.     *(ptr++) = (data[i]);
  911.     }
  912. }
  913.     /* Send tone data to the MT-32 */
  914.  
  915. SendToneData (filedata,timbre)
  916. UBYTE timbre,*filedata[];
  917.  
  918. {
  919. /* Receive request 1 system exclusive */
  920.  
  921. static UBYTE receivearray [] = {0xF0,0x41,0x10,0x16,0x12};
  922. UBYTE receive_request[265];    
  923.  
  924. UBYTE checksum=0;
  925. UBYTE *ptr;
  926.  
  927. int i,addSB,addLSB;
  928.  
  929. /* Clear the serial buffer of any unread data */
  930.  
  931. IORser->IOSer.io_Command = CMD_CLEAR;
  932. DoIO (IORser);
  933.  
  934. for (i=0;i<5;i++) receive_request[i]=receivearray[i];
  935. i = timbre * 0x0200; 
  936. addSB=(i>>8);    addLSB=((i<<4)>>4);
  937. receive_request[5]=8;receive_request[6]=addSB;receive_request[7]=addLSB;
  938. ptr = (UBYTE *) filedata;
  939.  
  940. for (i=8; i<254; i++)
  941.     {
  942.     receive_request[i] = *ptr;
  943.     checksum += receive_request[i];
  944.     ptr++;
  945.     }
  946. for (i=5;i<8;i++)  {
  947.     checksum += receive_request[i];
  948.             }
  949.    checksum=checksum%256;
  950.    if (checksum<=128) checksum=128-checksum;    
  951.    else if (checksum<256) checksum=256-checksum;
  952.    
  953. /* Add "end-system-exclusive" to tone data buffer */
  954.  
  955. receive_request[254] = checksum;
  956. receive_request[255]= END_SYSTEM_EXCLUSIVE;
  957.  
  958. /* Send tone data to MT-32 */
  959.  
  960. IORser->IOSer.io_Data = (APTR) &receive_request;
  961. IORser->IOSer.io_Length = 256;
  962. IORser->IOSer.io_Command = CMD_WRITE;
  963.  
  964. DoIO (IORser);
  965.  
  966. }
  967.  
  968. /* Write tone data to file */
  969.  
  970. void WriteToneData (tonedata,filename)
  971. char *filename;
  972. {
  973. FILE *fileptr;
  974. /* Loop until success */
  975. do      {
  976.     fileptr = fopen (filename, "w");
  977.         }
  978. while (fileptr == NULL);
  979. fwrite (tonedata, 254, 1, fileptr);
  980. fclose (fileptr);
  981. }
  982.  
  983. /* Read tone data from file */
  984.  
  985. LONG ReadToneData (filedata,filename)
  986. char *filename;
  987. UBYTE *filedata[];
  988. {
  989. FILE *fileptr;
  990. char buf[80];
  991. do    {
  992.     fileptr = fopen (filename, "r");
  993.     }
  994. while (fileptr == NULL);
  995. fread (filedata, 246, 1, fileptr);
  996. fclose (fileptr);
  997. return (TRUE);
  998. }
  999.  
  1000. void TimerHandler()
  1001. {
  1002. micros += 90909;
  1003. if (micros == 999999)
  1004.     {
  1005.     secs++;
  1006.     micros = 0;
  1007.     }
  1008. }
  1009.  
  1010. SetParams (io)
  1011. struct IOExtSer *io;
  1012. {
  1013. io->io_SerFlags = SERF_RAD_BOOGIE;
  1014. io->io_Baud = 31250;
  1015. io->IOSer.io_Command = SDCMD_SETPARAMS;
  1016. return(DoIO(io));
  1017. }
  1018.  
  1019.     
  1020. SendPatchData (channel,patchg,patchn)
  1021. UBYTE channel,patchg,patchn;
  1022. {
  1023. UBYTE checksum=0;
  1024.  
  1025. /* Send Request 1 system exclusive data */
  1026. UBYTE sendrequest[12];
  1027. static UBYTE sendarray[5] = {0xF0,0x41,0x10,0x16,0x12};
  1028.  
  1029. int i;
  1030. for (i=0;i<5;i++) sendrequest[i]=sendarray[i];
  1031. i = (channel-1) * 0x010;
  1032. sendrequest[5]=3;sendrequest[6]=0;sendrequest[7]=i;
  1033. sendrequest[8]=patchg;sendrequest[9]=patchn;
  1034. for (i=5;i<10;i++)  {
  1035.     checksum += sendrequest[i];
  1036.             }  
  1037.    checksum = checksum%256;
  1038.    if (checksum<=128) checksum = 128-checksum;    
  1039.    else if (checksum<256) checksum = 256-checksum;
  1040. sendrequest[10]=checksum;
  1041. sendrequest[11]=0xF7;
  1042.     
  1043. /* Clear the serial buffer of any unread data */
  1044.  
  1045. IORser->IOSer.io_Command = CMD_CLEAR;
  1046. DoIO (IORser);
  1047.  
  1048. /* Send request to MT-32 */
  1049.  
  1050. IORser->IOSer.io_Data = (APTR) &sendrequest;
  1051. IORser->IOSer.io_Length = sizeof(sendrequest);
  1052. IORser->IOSer.io_Command = CMD_WRITE;
  1053.  
  1054. DoIO(IORser);
  1055.     
  1056. }
  1057.  
  1058.  
  1059. ModifyPatchData (channel,address,parameter,patchn)
  1060. UBYTE channel,address,parameter,patchn;
  1061. {
  1062. UBYTE addSB,addLSB,checksum=0;
  1063.  
  1064. /* Send Request 1 system exclusive data */
  1065. UBYTE sendrequest[11];
  1066. static UBYTE sendarray[5] = {0xF0,0x41,0x10,0x16,0x12};
  1067.  
  1068. int i;
  1069. for (i=0;i<5;i++) sendrequest[i]=sendarray[i];
  1070. if (address==8)i = (channel-1) * 0x0200 + parameter;
  1071. addSB=(i>>8);addLSB=((i<<4)>>4);
  1072. sendrequest[5]=address;sendrequest[6]=addSB;sendrequest[7]=addLSB;
  1073. sendrequest[8]=patchn;
  1074. for (i=5;i<9;i++)  {
  1075.     checksum += sendrequest[i];
  1076.             }  
  1077.    checksum = checksum%256;
  1078.    if (checksum<=128) checksum = 128-checksum;    
  1079.    else if (checksum<256) checksum = 256-checksum;
  1080. sendrequest[9]=checksum;
  1081. sendrequest[10]=0xF7;
  1082.     
  1083. /* Clear the serial buffer of any unread data */
  1084.  
  1085. IORser->IOSer.io_Command = CMD_CLEAR;
  1086. DoIO (IORser);
  1087.  
  1088. /* Send request to MT-32 */
  1089.  
  1090. IORser->IOSer.io_Data = (APTR) &sendrequest;
  1091. IORser->IOSer.io_Length = sizeof(sendrequest);
  1092. IORser->IOSer.io_Command = CMD_WRITE;
  1093.  
  1094. DoIO(IORser);
  1095.     
  1096. }
  1097.  
  1098.